module nazo.diff;
/**
 * 簡単なテキストの差分
 * History:
 *          0.0.0.1 バージョン付け開始
 * Authors: Nazo
 * Version: 0.0.0.1
 * License: Public Domain
 */
import std.stdio, std.string;
///差分を取得する
class Diff{
  private{
    string[] beforelines;
    string[] afterlines;
    int[int] getNextEqualLine(int l,int l2){
      int[int] result;
      for(int i=l;beforelines.length > i;i++){
        for(int i2=l2;afterlines.length > i2;i2++){
          if(afterlines[i2]==beforelines[i]){
            result[0]=i;
            result[1]=i2;
            return result;
          }
        }
      }
      return null;
    }
  }
  public{
    ///変更前の内容
    string before;
    ///変更後の内容
    string after;
    ///差分の取得
    string[] getDiff(){
      beforelines=before.splitlines();
      afterlines=after.splitlines();
      int i=0;//beforeのライン
      int d=0;//beforeとafterのラインの差
      string[] result;
      while(beforelines.length >i || afterlines.length > i+d){
        if((beforelines.length >i) && (afterlines.length > i+d) && beforelines[i]==afterlines[i+d]){
          result~=" "~beforelines[i]~"\n";
          i++;
        }else{
          int[int] count=getNextEqualLine(i,i+d);
          if(count.length==0){
            while(afterlines.length > i+d){
              result~="+"~afterlines[i+d]~"\n";
              d++;
            }
            while(beforelines.length > i){
              result~="-"~beforelines[i]~"\n";
              i++;
            }
            break;
          }
          while(count[1]-i > d){
            result~="+"~afterlines[i+d]~"\n";
            d++;
          }
          while(count[0] > i){
            result~="-"~beforelines[i]~"\n";
            i++;
          }
          if(count[1]-i < d){
            d=count[1]-i;
          }
        }
      }
      return result;
    }
   ///コンストラクタ
   this(string before,string after){
      this.before=before;
      this.after=after;
    }
  }
}
